package com.example.onlineanswer.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.onlineanswer.model.dto.QuestionDTO;
import com.example.onlineanswer.model.entity.Question;
import com.example.onlineanswer.model.entity.QuestionType;
import com.example.onlineanswer.model.vo.QuestionVO;
import org.springframework.core.io.Resource;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * 题目服务接口
 */
public interface QuestionService extends IService<Question> {

    /**
     * 分页查询题目列表
     *
     * @param page         分页参数
     * @param contestId    竞赛ID（可选）
     * @param contestTitle 竞赛名称（可选）
     * @param typeId       题目类型ID（可选）
     * @param difficulty   难度（可选）
     * @param status       状态（可选）
     * @param keyword      关键词（可选）
     * @return 题目列表
     */
    IPage<QuestionVO> pageQuestionList(Page<QuestionVO> page, Long contestId, String contestTitle, Integer typeId, Integer difficulty, Integer status, String keyword);

    /**
     * 根据ID获取题目详情
     *
     * @param id 题目ID
     * @return 题目详情
     */
    QuestionVO getQuestionDetailById(Long id);

    /**
     * 创建题目
     *
     * @param question 题目信息
     * @return 题目ID
     */
    Long createQuestion(Question question);

    /**
     * 更新题目
     *
     * @param id       题目ID
     * @param question 题目信息
     * @return 是否成功
     */
    boolean updateQuestion(Long id, Question question);

    /**
     * 删除题目
     *
     * @param id 题目ID
     * @return 是否成功
     */
    boolean deleteQuestion(Long id);

    /**
     * 获取所有题目类型
     *
     * @return 题目类型列表
     */
    List<QuestionType> getAllQuestionTypes();

    /**
     * 批量导入题目
     *
     * @param contestId 竞赛ID
     * @param questions 题目列表
     * @return 导入成功的条数
     */
    int batchImportQuestions(Long contestId, List<Question> questions);

    /**
     * 获取题目详情
     *
     * @param id 题目ID
     * @return 题目详情
     */
    QuestionVO getQuestionDetail(Long id);

    /**
     * 获取下一题ID
     *
     * @param contestId 竞赛ID
     * @param currentOrderNum 当前题目序号
     * @return 下一题ID
     */
    Long getNextQuestionId(Long contestId, Integer currentOrderNum);

    /**
     * 获取竞赛中的题目数量
     *
     * @param contestId 竞赛ID
     * @return 题目数量
     */
    int getQuestionCountByContestId(Long contestId);

    /**
     * 根据竞赛ID获取题目列表
     *
     * @param contestId 竞赛ID
     * @return 题目列表
     */
    List<Question> getQuestionsByContestId(Long contestId);

    /**
     * 审核题目
     *
     * @param id         题目ID
     * @param status     审核状态 (1: 通过, 2: 拒绝)
     * @param reviewerId 审核人ID
     * @return 是否成功
     */
    boolean reviewQuestion(Long id, Integer status, Long reviewerId);

    /**
     * 分页查询竞赛的题目
     *
     * @param page      分页参数
     * @param contestId 竞赛ID
     * @return 题目分页数据
     */
    IPage<Question> getQuestionsByContestId(Page<Question> page, Long contestId);

    /**
     * 更新题目
     *
     * @param question 题目信息
     * @return 更新结果
     */
    boolean updateQuestion(Question question);

    /**
     * 获取题目详情，包括选项
     *
     * @param questionId 题目ID
     * @return 题目详情
     */
    QuestionDTO getQuestionDetails(Long questionId);

    /**
     * 校验答案是否正确
     *
     * @param questionId 题目ID
     * @param answer     答案
     * @return 是否正确
     */
    boolean checkAnswer(Long questionId, String answer);

    /**
     * 获取下一题
     *
     * @param contestId     竞赛ID
     * @param currentQuestionId 当前题目ID
     * @return 下一题
     */
    Question getNextQuestion(Long contestId, Long currentQuestionId);

    /**
     * 从Excel文件导入题目
     *
     * @param contestId 竞赛ID
     * @param file Excel文件
     * @return 导入成功的条数
     * @throws IOException 文件处理异常
     */
    int importQuestionsFromExcel(Long contestId, MultipartFile file) throws IOException;

    /**
     * 生成题目导入模板
     *
     * @return 模板资源
     * @throws IOException 文件处理异常
     */
    Resource generateQuestionImportTemplate() throws IOException;
} 